package cn.kgc.ssm.service.impl;

import cn.kgc.ssm.mapper.AccountMapper;
import cn.kgc.ssm.service.AccountService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @author 课工场
 * @date 2024/5/9
 * @description
 *  @Transactional
 *    1. 添加在方法上  只对当前方法有效
 *    2. 添加在类上    当前类中的所有方法有效
 *
 * 注解属性：
 *      isolation     事务的隔离级别
 *      DEFAULT             Use the default isolation level of the underlying datastore   使用数据库默认的事务隔离级别
 *      1.READ_UNCOMMITTED     读未提交
 *       A  -> select    3  ->   4
 *
 *       B  -> insert   commit  4  rollback  3
 *
 *      2.READ_COMMITTED       读已提交
 *
 *      A  -> select    3    3   4
 *
 *      B  -> insert   commit  4  rollback  3
 *
 *      3.REPEATABLE_READ      可重复读    Mysql  默认
 *
 *      A  -> select    3
 *
 *      B  -> insert   commit  4  rollback  3
 *
 *      4.SERIALIZABLE         串行化
 *
 *      A  -> select    3    等待   4     3
 *
 *      B  -> insert   commit  4  rollback  3
 *
 *
 *    事务的特点：
 *      1.原子性         不可在分割  最小执行单元
 *      2.一致性        数据一致性
 *      3.隔离性        事务的隔离级别
 *      4.持久性        事务提交 持久化数据到数据
 */
@Service
@Transactional
public class AccountServiceImpl implements AccountService {

    @Resource
    private AccountMapper accountMapper;

    // @Transactional
    @Override
    public Boolean transferMoney(String from, String to, Double money) {

        //  from   -money
        accountMapper.transferMoney(from,-money);

         int  a = 1/0;

        // to   +money
        accountMapper.transferMoney(to,money);

        return true;
    }

    @Override
    public Boolean transferMoney2(String from, String to, Double money) {
        //  from   -money
        accountMapper.transferMoney(from,-money);
         int  a = 1/0;
        // to   +money
        accountMapper.transferMoney(to,money);
        return true;
    }
}
